package com.zhwl.manage.service.impl;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhwl.common.exception.ServiceException;
import com.zhwl.common.utils.SecurityUtils;
import com.zhwl.manage.domain.RateTreeCategories;
import com.zhwl.manage.domain.Variables;
import com.zhwl.manage.mapper.RateTreeCategoriesMapper;
import com.zhwl.manage.mapper.VariablesMapper;
import com.zhwl.manage.service.IVariablesService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 变量管理Service业务层处理
 *
 * @author mobin
 * @date 2025-07-22
 */
@Service
@RequiredArgsConstructor
public class VariablesServiceImpl extends ServiceImpl<VariablesMapper, Variables> implements IVariablesService {
    @Autowired
    private VariablesMapper variablesMapper;

    private final RateTreeCategoriesMapper rateTreeCategoriesMapper;

    /**
     * 查询变量管理
     *
     * @param id 变量管理主键
     * @return 变量管理
     */
    @Override
    public Variables selectVariablesById(Long id) {
        return variablesMapper.selectVariablesById(id);
    }

    /**
     * 查询变量管理列表
     *
     * @param variables 变量管理
     * @return 变量管理
     */
    @Override
    public List<Variables> selectVariablesList(Variables variables) {
        return variablesMapper.selectVariablesList(variables);
    }

    /**
     * 新增变量管理
     *
     * @param variables 变量管理
     * @return 结果
     */
    @Override
    public int insertVariables(Variables variables) {
        variables.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
        variables.setCreateTime(new Date());
        return variablesMapper.insertVariables(variables);
    }

    /**
     * 修改变量管理
     *
     * @param variables 变量管理
     * @return 结果
     */
    @Override
    public int updateVariables(Variables variables) {
        variables.setUpdateTime(DateUtil.date());
        variables.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
        return variablesMapper.updateVariables(variables);
    }

    /**
     * 批量删除变量管理
     *
     * @param ids 需要删除的变量管理主键
     * @return 结果
     */
    @Override
    public int deleteVariablesByIds(Long[] ids) {
        if(ids ==  null || ids.length == 0){
            throw new ServiceException("要删除的变量id 不能是空的");
        }
        // 在删除变量之前，需要查看公式表中有没有用到这个变量
        List<RateTreeCategories> categories =  rateTreeCategoriesMapper.selectList(null);
        for(Long id: ids){
            Variables variables = variablesMapper.selectById(id);
            categories.forEach(item -> {
                // 判断是否包含
                if(item.getConsumptionDataType() == null || item.getValueAddedDatatype() == null){
                    return;
                }
                if(item.getConsumptionDataType().contains(variables.getVariable()) || item.getValueAddedDatatype().contains( variables.getVariable())){
                    throw new ServiceException("变量被使用，请先删除使用此变量的公式");
                }
            });
        }
        return variablesMapper.deleteVariablesByIds(ids);
    }

    /**
     * 删除变量管理信息
     *
     * @param id 变量管理主键
     * @return 结果
     */
    @Override
    public int deleteVariablesById(Long id) {
        // 在删除变量之前，需要查看公式表中有没有用到这个变量
        List<RateTreeCategories> categories =  rateTreeCategoriesMapper.selectList(null);

        Variables variables = variablesMapper.selectById(id);
        String variable = variables.getVariable();

        categories.forEach(item -> {
            // 判断是否包含
            if(item.getConsumptionDataType().contains(variable) || item.getValueAddedDatatype().contains( variable)){
                throw new ServiceException("变量被使用，请先删除使用此变量的公式");
            }
        });
        return variablesMapper.deleteVariablesById(id);
    }
}
